ERC1410 -Partially Fungible Token Standard
まとめ
partitionを追跡することで実現しよう、という試み
トークンの一部における法的条件や証券性質が違ったりする可能性があるので、それに対処
証券の多様化に貢献(?)
Tomato.icon<違うトークンとしちゃえばいいんじゃね?
こうやってやらなあかん事例がそんなに思いつかない(思いつかない自分がアホなだけ説)
github上でも同様の議論。RegSとRegDとで発行する場合、が例に挙げられている
署名の回数とか色々複雑に絡んできそうなのでユースケースを具体的に考えていきたい
必要なければdefaultトランシェだけに設定すればいい、との意見もあり
トークンのbalanceの一部と投資家のメタデータとを結びつけることを可能にすることで実現
balance:トークンの送料
メタデータ:投資家にかかるいろんな情報
内容
証券token情報に関する内容
function balanceOf:投資家が保有するトークン全体の量
Input:
address _tokenHolder:トークン保有者のアドレス
Return:
uint256:トークン総量を返答
ERC20やERC777と同じ
function balanceOfPartition:各トランシェごとの保有量を表示する関数
Input:
byte32 _partition: トランシェの分野を確定
function balanceOfPartitionで定められる
address _tokenHolder:トークン保有者のアドレス
Return:
uint256:各トランシェのトークン量を返答
各function patitionOfごとの総量を表示
function balanceOfPartitionの総量がfunction balanceOfの値と一致している必要有
function balanceOf:トランシェ情報を表示
Input:
address _tokenHolder:トークン保有者のアドレス
Return:
bytes32 []:各トランシェの情報を配列で返答
function totalSupply:トークンの発行総量を返答
Return:
uint256:総量を返答
トークン移転に関する内容
function transferByPartition:どのトランシェからどのトランシェへ送られたのかを把握する関数
Input:
byte32 _partition: トランシェの分野を確定
address _to:受信者アドレス
uint256 _value:送付量
byte _data:送付認証情報
Return:
bytes32:受信者のトランシェを返答
譲渡が失敗した場合はthrowを投げる必要有
function operatorTransferByPartition:第三者がトランシェを送る場合
Input:この関数独特の物のみ記載
bytes _operatorData:送信を実行する者のデータ
疑問:このbytesはどっから持ってきたの?
_operatorがfunction isOperatorForPartitionもしくはfunction isOperatorForで認証されていない場合、throwする必要がある
Return:
byte32:送付先のトランシェ
function canTransferByPartition:譲渡制限に引っかかるかどうかを判別する関数
Input:全て今迄登場した変数と意味は同じ
address _from,address _to, byte32 _partition, uint256 _value, bytes _data
Return:
byte:譲渡制限が許可されたか否かを判断
byte32:譲渡制限の理由をカスタマイズして返答可能
詳細は、同上
byte32:送付先のトランシェ情報
第三者によるトークン移転に関する内容
function authorizeOperator:Operatorの許可を与える関数
Input:
address _operator:オペレーターとなるアドレス
Return;
特になし:msg.senderのすべてのトランシェに許可を与えるようになっている必要有
function revokeOperator:Operatorの権利を取り消す関数
Input:
address _operator:オペレーターとなるアドレス
疑問:これ、authorizeOperatorと分けるメリットって何?
function isOperatorFor:トークン保持者のすべてのトークンに対してオペレータの権限があるかをチェックする関数
Input:
address _operator:チェックするオペレータのアドレス
address _tokenHolder:チェックする保有者のアドレス
Return:
bool:function authorizeOperator, function revokeOperatorの条件を満たしていた場合true
function authorizeOperatorByPartition, function revokeOperator, function isOperatorForは上記三つの関数に、Inputの部分に、トランシェを表すbyte32 _partitionを加えたもの
インターフェース
code:ERC1410(javascript)
interface IERC1410 {
// Token Information
function balanceOf(address _tokenHolder) external view returns (uint256);
function balanceOfByPartition(bytes32 _partition, address _tokenHolder) external view returns (uint256);
function partitionsOf(address _tokenHolder) external view returns (bytes32[]);
function totalSupply() external view returns (uint256);
// Token Transfers
function transferByPartition(bytes32 _partition, address _to, uint256 _value, bytes _data) external returns (bytes32);
function operatorTransferByPartition(bytes32 _partition, address _from, address _to, uint256 _value, bytes _data, bytes _operatorData) external returns (bytes32);
function canTransferByPartition(address _from, address _to, bytes32 _partition, uint256 _value, bytes _data) external view returns (byte, bytes32, bytes32);
// Operator Information
function isOperator(address _operator, address _tokenHolder) external view returns (bool);
function isOperatorForPartition(bytes32 _partition, address _operator, address _tokenHolder) external view returns (bool);
// Operator Management
function authorizeOperator(address _operator) external;
function revokeOperator(address _operator) external;
function authorizeOperatorByPartition(bytes32 _partition, address _operator) external;
function revokeOperatorByPartition(bytes32 _partition, address _operator) external;
// Issuance / Redemption
function issueByPartition(bytes32 _partition, address _tokenHolder, uint256 _value, bytes _data) external;
function redeemByPartition(bytes32 _partition, uint256 _value, bytes _data) external;
function operatorRedeemByPartition(bytes32 _partition, address _tokenHolder, uint256 _value, bytes _operatorData) external;
// Transfer Events
event TransferByPartition(
bytes32 indexed _fromPartition,
address _operator,
address indexed _from,
address indexed _to,
uint256 _value,
bytes _data,
bytes _operatorData
);
// Operator Events
event AuthorizedOperator(address indexed operator, address indexed tokenHolder);
event RevokedOperator(address indexed operator, address indexed tokenHolder);
event AuthorizedOperatorByPartition(bytes32 indexed partition, address indexed operator, address indexed tokenHolder);
event RevokedOperatorByPartition(bytes32 indexed partition, address indexed operator, address indexed tokenHolder);
// Issuance / Redemption Events
event IssuedByPartition(bytes32 indexed partition, address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);
event RedeemedByPartition(bytes32 indexed partition, address indexed operator, address indexed from, uint256 amount, bytes operatorData);
}
Source